package com.systemic.utils;

import com.systemic.pojo.DynamicImage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * @ClassName: FileUtils
 * @Description: 文件工具类
 * @Author:
 * @CreateTime: 2024-01-06 13:00
 * @Version:
 **/
public class FileUtils {


    private static final List<String> VIDEO_EXTENSIONS = Arrays.asList(
            "mp4", "avi", "mov", "mkv", "flv", "wmv", "3gp", "vob", "ts" // 添加更多视频格式后缀
    );

    private static final List<String> MUSIC_EXTENSIONS = Arrays.asList(
            "mp3", "wav", "ogg", "flac", "aac", "m4a" // 添加更多音频格式后缀
    );

    private static String getExtension(String filename) {
        if (filename == null) {
            return null;
        }
        int dotIndex = filename.lastIndexOf('.');
        if (dotIndex == -1) {
            return null;
        }
        return filename.substring(dotIndex + 1);
    }

    /**
     * 上传单个图片
     * @param file
     * @param path
     * @param url
     * @return
     */
    public static String uploadImage(MultipartFile file, String path, String url) {
        try {
            // 获取上传文件的原始文件名
            String originalFilename = file.getOriginalFilename();
            assert originalFilename != null;
            // 将大写改为小写
            originalFilename = originalFilename.toLowerCase();
            // 生成新的文件名
            String newFilename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
            // 创建文件对象，并确保目录存在
            File fileDir = new File(path, newFilename);
            if (!fileDir.getParentFile().exists()) {
                fileDir.getParentFile().mkdirs();
            }
            // 上传文件
            file.transferTo(fileDir);
            // 构建文件的URL
            return url + newFilename;
        } catch (IOException e) {
            throw new RuntimeException("上传失败", e);
        }
    }

    public static Boolean isVideo(MultipartFile file) {
        // 获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            return false; // 文件名不存在，返回false
        }
        // 获取文件名的后缀
        String extension = getExtension(originalFilename);
        if (extension == null) {
            return false; // 没有后缀，返回false
        }
        // 判断文件名的后缀是否是常见的视频格式
        return VIDEO_EXTENSIONS.contains(extension.toLowerCase());
    }

    public static Boolean isMusic(MultipartFile file) {
        // 获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            return false; // 文件名不存在，返回false
        }
        // 获取文件名的后缀
        String extension = getExtension(originalFilename);
        if (extension == null) {
            return false; // 没有后缀，返回false
        }
        // 判断文件名的后缀是否是常见的音频格式
        return MUSIC_EXTENSIONS.contains(extension.toLowerCase());
    }



    /**
     * 将本地静态资源上传到nginx
     * @param resourceName
     * @param path
     * @param url
     * @return
     */
    public static String copyImageToNginx(String resourceName, String path, String url ) {
        // 获取图片文件的输入流
//        Path resourcePath = Paths.get("src/main/resources/static", resourceName);
        Path resourcePath = Paths.get("classes/static", resourceName);
        try (FileInputStream fis = new FileInputStream(resourcePath.toFile())) {
            // 生成随机的图片文件名
            String randomFileName = UUID.randomUUID().toString() + ".png";
            // 构建目标文件路径
            Path targetPath = Paths.get(path, randomFileName);
            // 创建目标文件
            Files.createDirectories(targetPath.getParent());
            // 获取目标文件的输出流
            try (FileOutputStream fos = new FileOutputStream(targetPath.toFile())) {
                // 复制文件
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    fos.write(buffer, 0, length);
                }
            }
            // 返回图片的 URL
            return url + randomFileName;
        } catch (IOException e) {
            throw new RuntimeException("Failed to copy image to Nginx path", e);
        }
    }


    /**
     * 删除文件
     * @param filePath
     * @return
     */
    public static boolean delete(String filePath) throws MalformedURLException {
        boolean flag = false;
        //根据路径创建文件对象
        File file = new File(filePath);
        //路径是个文件且不为空时删除文件
        if(file.isFile() && file.exists()){
            flag = file.delete();
        }
        //删除失败时，返回false
        return flag;
    }




}
